package com.example.store.service.impl;

import com.example.store.entity.Cart;
import com.example.store.entity.Product;
import com.example.store.mapper.CartMapper;
import com.example.store.mapper.ProductMapper;
import com.example.store.service.ICarService;
import com.example.store.service.IProductService;
import com.example.store.service.ex.AccessDeniedException;
import com.example.store.service.ex.CartNotFoundException;
import com.example.store.service.ex.InsertException;

import com.example.store.service.ex.ProductNotFoundException;
import com.example.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class CartServiceImpl implements ICarService {

    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private IProductService productService;

    /**
     * 添加商品到购物车
     * @param pid 商品id
     * @param num  添加的数量
     *@param uid 用户id
     * @param username 用户名
     */
    @Override
    public void addToCart(Integer pid, Integer num, Integer uid, String username) {
        //查询购物车中是否有这个数据
        Cart result  = cartMapper.findByUidPid(uid,pid) ;

        Date now = new Date();
        if (result==null){
                Cart cart1 = new Cart();
                cart1.setUid(uid);
                cart1.setPid(pid);
                cart1.setNum(num);
                // 调用productService.findById(pid)查询商品数据，得到商品价格
                Product product = productService.findById(pid);
                // 封装数据：price
                cart1.setPrice(product.getPrice());
                // 封装数据：4个日志
                cart1.setCreatedUser(username);
                cart1.setCreatedTime(now);
                cart1.setModifiedUser(username);
                cart1.setModifiedTime(now);
                // 调用insert(cart)执行将数据插入到数据表中
                Integer rows = cartMapper.insert(cart1);

        }else {
            //否，表示该购物车已经有该商品数据
            //从查询就结果中拿原数量和添加数量相加
            Integer num1 = result.getNum()+num;
            Integer cid = result.getCid();
            //执行更新数量
            Integer rows = cartMapper.updateNumByCid(cid,num1,username,now);
            if (rows!=1){
                throw new InsertException("插入数据时产生未知的异常");
            }

        }
    }


    @Override
    public void updateNumByCid(Integer cid, Integer num, String modifiedUser, Date modifiedTime) {

    }

    /**
     * 多表联合查询，需要用到VO类
     * @param uid
     * @return
     */
    @Override
    public List<CartVO> getVOByUid(Integer uid) {

        List<CartVO> voByUid = cartMapper.findVOByUid(uid);

        return voByUid;
    }

    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = cartMapper.findVOByCids(cids);
        /**
         for (CartVO cart : list) {
         if (!cart.getUid().equals(uid)) {
         list.remove(cart);
         }
         }
         */
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return list;
    }

    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
// 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }
// 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)) {
// 是：抛出AccessDeniedException
            throw new AccessDeniedException("不能访问其他用户的购物车数据");
        }
// 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
// 根据查询结果中的原数量增加1得到新的数量num
        Integer num = result.getNum() + 1;
// 创建当前时间对象，作为modifiedTime
        Date now = new Date();
// 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = cartMapper.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }
// 返回新的数量
        return num;
    }

}
